package org.reasm.m68k.assembly.internal;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.Immutable;
@Immutable
enum GeneralPurposeRegister {
D0, D1, D2, D3, D4, D5, D6, D7, A0, A1, A2, A3, A4, A5, A6, A7;
@Nonnull
private static final GeneralPurposeRegister[] VALUES = GeneralPurposeRegister.values();
@CheckForNull
static GeneralPurposeRegister identify(@Nonnull String identifier) {
if (identifier.length() == 2) {
final char ch = identifier.charAt(0);
final boolean isDataRegister = equalsAsciiCaseInsensitive(ch, 'D');
if (isDataRegister || equalsAsciiCaseInsensitive(ch, 'A')) {
final int registerNumber = parseRegisterNumber(identifier.charAt(1));
if (registerNumber != -1) {
return VALUES[(isDataRegister ? 0 : 8) | registerNumber];
}
} else if (equalsAsciiCaseInsensitive(ch, 'S')) {
if (equalsAsciiCaseInsensitive(identifier.charAt(1), 'P')) {
return A7;
}
}
}
return null;
}
private static boolean equalsAsciiCaseInsensitive(char a, char b) {
assert b >= 'A' && b <= 'Z';
return a == b || a == (b | 0x20);
}
private static int parseRegisterNumber(char ch) {
if (ch >= '0' && ch <= '7') {
return ch - '0';
}
return -1;
}
}